package mysql

import (
	"database/sql"
	"fmt"
	"sync"
	"time"

	"gitee.com/zibianqu/fyzdb/dsn"
	"gitee.com/zibianqu/fyzdb/lib"
	_ "github.com/go-sql-driver/mysql"
)

var DbList sync.Map

type IMysql interface {
	InitDB(config *dsn.MysqlConfig) IMysql
	GetDb(connection ...string) *sql.DB
}

type MysqlImpl struct {
}

func Mysql() IMysql {
	mysqlInstance := MysqlImpl{}
	return &mysqlInstance
}

// 初始化
func (m *MysqlImpl) InitDB(config *dsn.MysqlConfig) IMysql {
	// 已初始化后无需再次初始化
	connection := config.Connection
	if _, ok := DbList.Load(connection); ok {
		return m
	}
	// 连接池配置
	cPool := config.ConnectionPool
	DB, _ := sql.Open("mysql", config.Dsn)
	//设置数据库最大连接数
	DB.SetMaxOpenConns(cPool.MaxOpenConn)
	//设置上数据库最大闲置连接数
	DB.SetMaxIdleConns(cPool.MaxIdleConn)
	// 设置连接最大存活时长
	if cPool.ConnMaxLifetime > 0 {
		DB.SetConnMaxLifetime(time.Duration(cPool.ConnMaxLifetime))
	}
	// 去掉表复数
	if config.SingularTable {
	}
	// 是否开启日志
	if config.LogMode == 1 {

	}
	//验证连接
	if err := DB.Ping(); err != nil {
		fmt.Println("open database fail")
		lib.ThrowError(err)
	}
	DbList.Store(connection, DB)
	fmt.Println("connnect success")
	return m
}

// 获取连接
func (m *MysqlImpl) GetDb(params ...string) *sql.DB {
	length := len(params)
	connection := dsn.MysqlCfg().Connection
	if length == 1 && params[0] != "" {
		connection = params[0]
	}
	if v, ok := DbList.Load(connection); ok {
		return v.(*sql.DB)
	}
	panic("db.go: mysql connection error !")
}
